package com.bpmn.flow.controller;

import com.bpmn.common.annotation.ResponseInfoWrapper;
import com.bpmn.common.pojo.PageResult;
import com.bpmn.flow.controller.form.ModelDesignForm;
import com.bpmn.flow.controller.form.ModelForm;
import com.bpmn.flow.controller.query.FlowModelQuery;
import com.bpmn.flow.controller.vo.ModelVo;
import com.bpmn.flow.service.ModelService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

/**
 * @author rain
 * @description 模型控制器
 * @date 2024年12月26日 14:37
 */
@Tag(name = "流程模型相关")
@RestController
@RequiredArgsConstructor
@ResponseInfoWrapper
@RequestMapping(value = "model")
public class ModelController {

    private final ModelService modelService;

    /**
     * 获取流程模型列表
     *
     * @param flowModelQuery 流程模型查询条件
     * @return 分页结果
     */
    @Operation(summary = "获取流程模型列表")
    @GetMapping("/list")
    public PageResult<ModelVo> getFlowModels(FlowModelQuery flowModelQuery) {
        return modelService.getFlowModels(flowModelQuery);
    }

    /**
     * 创建流程模型
     *
     * @param modelForm 流程模型信息
     * @return 是否创建成功
     */
    @Operation(summary = "创建流程模型")
    @PostMapping("/create")
    public Boolean createFlowModel(@RequestBody ModelForm modelForm) {
        return modelService.createFlowModel(modelForm);
    }

    /**
     * 更新流程模型
     *
     * @param modelForm 流程模型信息
     * @return 是否更新成功
     */
    @Operation(summary = "更新流程模型")
    @PostMapping("/update")
    public Boolean updateFlowModel(@RequestBody ModelForm modelForm) {
        return modelService.updateFlowModel(modelForm);
    }

    /**
     * 模型设计
     *
     * @param designForm 模型设计信息
     * @return 是否设计成功
     */
    @Operation(summary = "模型设计")
    @PostMapping("/design")
    public Boolean modelDesign(@RequestBody ModelDesignForm designForm) {
        return modelService.modelDesign(designForm.getId(), designForm.getXml());
    }

    /**
     * 根据ID获取流程模型
     *
     * @param id 流程模型ID
     * @return 流程模型信息
     */
    @Operation(summary = "根据ID获取流程模型")
    @GetMapping("/{id}")
    public ModelVo getFlowModelById(@PathVariable String id) {
        return modelService.getFlowModelById(id);
    }

    /**
     * 部署流程模型
     *
     * @param id 流程模型ID
     * @return 是否部署成功
     */
    @Operation(summary = "部署流程模型")
    @PostMapping("/deploy/{id}")
    public Boolean modelDeploy(@PathVariable String id) {
        return modelService.modelDeploy(id);
    }

    /**
     * 删除流程模型
     *
     * @param id 流程模型ID
     * @return 是否删除成功
     */
    @Operation(summary = "删除流程模型")
    @PostMapping("/delete/{id}")
    public Boolean modelDelete(@PathVariable String id) {
        return modelService.modelDelete(id);
    }

}
